"""
多线程更新UI数据
基本原理：子线程的信号绑定到主线程的槽函数，子线程完成任务发送data给主线程的槽函数，该槽函数更新主线程UI

"""

from PyQt5.QtCore import QThread, pyqtSignal, QDateTime
from PyQt5.QtWidgets import QApplication, QDialog, QLineEdit
import time
import sys


class BackThread(QThread):
    update_time = pyqtSignal(str)

    # 定义一个run方法，在调用该线程的时候会自动执行的方法
    def run(self):
        while True:
            data = QDateTime.currentDateTime()    # 定义一个当前时间的对象
            currentTime = data.toString('yyyy-MM-dd hh:mm:ss')
            # 将时间格式化一下（年-月-日 时：分：秒）
            self.update_time.emit(str(currentTime))
            time.sleep(1)

class ThreadUpdateUI(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        self.setWindowTitle('多线程更新UI数据')
        self.resize(400, 100)
        self.input = QLineEdit(self)
        self.input.resize(400, 100)

        self.initUI()

    def initUI(self):
        self.backend = BackThread()
        self.backend.update_time.connect(self.handelDisplay)

        self.backend.start()          # 启动线程

    def handelDisplay(self, data):
        self.input.setText(data)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = ThreadUpdateUI()
    example.show()
    sys.exit(app.exec_())

# 小结一下：最终先是效果是--子线程不断向主线程发送信号，从而调用主线程当中的槽来完成时间的实时显示
#          也就是我们通过信号和槽在两个线程中传递数据！！！
#          这里也可以进行延申，也就是我们可以通过信号和槽在多个线程中传递数据
